package iso2.persistencia;

import iso2.dominio.Articulo;
import iso2.dominio.ArticuloInvalidoException;
import iso2.dominio.Pedido;
import iso2.dominio.PedidoInvalidoException;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class FPPedido {
	public static void insertPedido (Pedido pedido) 
			throws SQLException, ConexionesOcupadasException {
		Agente agente = Agente.getInstancia();
		Connection conexion = agente.getConexion();

		// Insertar el pedido en la base de datos
		PreparedStatement sentencia = conexion.prepareStatement(
		"insert into pedido (fecha, estado, importe, usuario)" +
		"values(?, ?, ?, ?);", Statement.RETURN_GENERATED_KEYS);
				
		sentencia.setDate(1, pedido.getFecha());
		sentencia.setString(2, pedido.getEstado());
		sentencia.setDouble(3, pedido.getImporte());
		sentencia.setString(4, pedido.getUsuario());
		
		sentencia.executeUpdate();
		ResultSet resultSet = sentencia.getGeneratedKeys();
		
		resultSet.next();
		int lastId = resultSet.getInt(1);
		pedido.setId(lastId);
		sentencia.close();
		
		// Insertar una entrada en la tabla pedido_articulo por cada articulo
		sentencia = conexion.prepareStatement(
		"insert into pedido_articulo (pedido, articulo, cantidad)" +
		"values(?, ?, ?);");
		
		for (int i = 0; i < pedido.getArticulos().size(); i++) {
			sentencia.setInt(1, pedido.getId());
			sentencia.setInt(2, pedido.getArticulos().get(i).getReferencia());
			sentencia.setInt(3, pedido.getArticulos().get(i).getCantidad());
			
			sentencia.executeUpdate();
			sentencia.clearParameters();
		}
		
		sentencia.close();
		agente.liberarConexion(conexion);
	}
	
	
	public static void readPedido(Pedido pedido) 
		throws SQLException, ConexionesOcupadasException, 
				PedidoInvalidoException, ArticuloInvalidoException {
		Agente agente = Agente.getInstancia();
		Connection conexion = agente.getConexion();
		Articulo articulo;
		
		// Buscar el pedido en la base de datos
		PreparedStatement sentencia = conexion.prepareStatement(
				"select * from pedido where id = ?;");
		sentencia.setInt(1, pedido.getId());
		ResultSet resultado = sentencia.executeQuery();
		
		// El pedido no existe
		if (!resultado.next()) {
			agente.liberarConexion(conexion);
			throw new PedidoInvalidoException();
		}
		
		// Insertar datos pedido
		pedido.setFecha(resultado.getDate("fecha"));
		pedido.setEstado(resultado.getString("estado"));
		pedido.setImporte(resultado.getInt("importe"));
		pedido.setUsuario(resultado.getString("usuario"));
		sentencia.close();
		
		// Insertar datos articulos
		sentencia = conexion.prepareStatement(
				"select * from pedido_articulo where pedido = ?;");
		sentencia.setInt(1, pedido.getId());
		resultado = sentencia.executeQuery();
		
		while (resultado.next()) {
			articulo = new Articulo(resultado.getInt("articulo"));
			articulo.buscarArticulo();
			articulo.setCantidad(resultado.getInt("cantidad"));
			pedido.getArticulos().add(articulo);
		}

		sentencia.close();
		agente.liberarConexion(conexion);
	}
	
	public static void updateEstadoPedido(Pedido pedido) throws SQLException,
												ConexionesOcupadasException {
		Agente agente = Agente.getInstancia();
		Connection conexion = agente.getConexion();
		
		PreparedStatement sentencia;
		
		sentencia = conexion.prepareStatement("update pedido set estado = ?" +
				"where id = ?;");
		
		sentencia.setString(1, pedido.getEstado());
		sentencia.setInt(2, pedido.getId());
		
		sentencia.executeUpdate();
		sentencia.close();
		agente.liberarConexion(conexion);
	}
	
	public static Pedido[] buscarPedidos(String usuario)
			throws SQLException, ConexionesOcupadasException, PedidoInvalidoException, ArticuloInvalidoException
	{
		Agente agente = Agente.getInstancia();
		Connection conexion = agente.getConexion();
		ArrayList<Pedido> pedidos = new ArrayList<Pedido>();
		Pedido pedido;
		
		// Buscar artículos en la base de datos
		
		PreparedStatement sentencia;
		
		sentencia = conexion.prepareStatement("select * from pedido where usuario = ?");
		sentencia.setString(1, usuario);
		
		ResultSet resultado = sentencia.executeQuery();
	
		while (resultado.next()) {
			pedido = new Pedido(resultado.getInt("id"));
			pedido.readPedido();
			pedidos.add(pedido);
		}
		
		agente.liberarConexion(conexion);
		
		Pedido [] r = new Pedido[pedidos.size()]; 
		r = pedidos.toArray(r);;
		return r;
	}
}
